package pe.com.bbva.ge.vista.vaadin.ui.utileria;

import java.math.BigDecimal;
import java.math.BigInteger;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;

import pe.com.bbva.ge.utileria.UtileriaComun;

import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.ui.TextField;

public class ManejadorDenominacion implements TextChangeListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 8392675677825081345L;
	
	private TextField txtSolicitado;
	private TextField txtCantidad;
	private TextField txtImporte;
	private TextField txtDeteriorado;
	private BigDecimal valor;
	
	private TextField txtTotalPorDivisa;
	private TextField txtDiferencial;
	
	private ManejadorDivisa manejadorDivisa;
	
	public ManejadorDenominacion() {
	}
	
	public ManejadorDenominacion(TextField txtSolicitado,
			TextField txtCantidad, TextField txtImporte,
			TextField txtDeteriorado, BigDecimal valor, 
			TextField txtTotalPorDivisa, TextField txtDiferencial) {
		this.txtSolicitado = txtSolicitado;
		this.txtCantidad = txtCantidad;
		this.txtImporte = txtImporte;
		this.txtDeteriorado = txtDeteriorado;
		this.valor = valor;
		this.txtTotalPorDivisa = txtTotalPorDivisa;
		this.txtDiferencial = txtDiferencial;
		
		this.txtSolicitado.setValue("0.0");
		this.txtCantidad.addListener(this);
		this.txtCantidad.setImmediate(true);
		this.txtImporte.addListener(this);
		if(this.txtDeteriorado != null)
		{
			this.txtDeteriorado.addListener(this);
		}
	}
	
	@Override
	public void textChange(TextChangeEvent event) {

		System.out.println("Antes " + this.txtCantidad.getValue());
		System.out.println("Despues " + event.getText());
		System.out.println("---------------------------------------------------");
		
		BigDecimal total = new BigDecimal("0.0");
		if(event.getSource().equals(this.txtCantidad))
		{
			this.txtImporte.setValue(StringUtils.EMPTY);
			if(this.txtDeteriorado != null)
			{
				this.txtDeteriorado.setValue(StringUtils.EMPTY);
			}
			
			BigDecimal cantidad = UtileriaComun.obtenerBigDecimal(event.getText());
			total = valor.multiply(cantidad);
			
		}
		else if(event.getSource().equals(this.txtImporte))
		{
			this.txtCantidad.setValue(StringUtils.EMPTY);
			if(this.txtDeteriorado != null)
			{
				this.txtDeteriorado.setValue(StringUtils.EMPTY);
			}
			total = UtileriaComun.obtenerBigDecimal(event.getText());
		}
		else if(event.getSource().equals(this.txtDeteriorado))
		{
			this.txtImporte.setValue(StringUtils.EMPTY);
			BigDecimal solicitado = new BigDecimal(StringUtils.trimToEmpty((String)this.txtSolicitado.getValue()));
			BigDecimal subtotal = valor.multiply(UtileriaComun.obtenerBigDecimal(event.getText()));
			total = solicitado.add(subtotal);
		}
		
		this.txtSolicitado.setValue(total.toString());
		
		BigDecimal bdDiferencial = UtileriaVista.obtenerBigDecimal(this.txtDiferencial);
		BigDecimal bdTotalDivisa = UtileriaVista.obtenerBigDecimal(this.txtTotalPorDivisa);
		
		if(bdDiferencial.compareTo(total)>0)//no excede del limite
		{
			bdDiferencial = bdDiferencial.subtract(total);
		}
		else//exedio o es llegó al limite
		{
			bdTotalDivisa = bdTotalDivisa.add(total);
			bdDiferencial = new BigDecimal("0.0");
		}
		
		this.txtTotalPorDivisa.setValue(bdTotalDivisa.toString());
		this.txtDiferencial.setValue(bdDiferencial.toString());
	}
	
	public BigInteger getSolicitado()
	{
		BigInteger cantidadSolicitada = new BigInteger("0");		
		
		if(StringUtils.isNotEmpty((String)txtImporte.getValue()) && NumberUtils.isNumber((String)txtImporte.getValue()))
		{
			BigDecimal total = new BigDecimal(StringUtils.trimToEmpty((String)txtImporte.getValue()));
			cantidadSolicitada = total.divide(valor).toBigInteger();
		}
		else if(StringUtils.isNotEmpty((String)txtCantidad.getValue()) && NumberUtils.isNumber((String)txtCantidad.getValue()))
		{
			cantidadSolicitada = new BigInteger(StringUtils.trimToEmpty((String)txtCantidad.getValue()));
		}
		
		return cantidadSolicitada;
	}
	
	public BigInteger getDeteriorado()
	{
		BigInteger deteriorado = new BigInteger("0");
		if(this.txtDeteriorado != null && StringUtils.isNotEmpty((String)txtDeteriorado.getValue()) && NumberUtils.isNumber((String)txtDeteriorado.getValue()))
		{
			deteriorado = new BigInteger(StringUtils.trimToEmpty((String)txtDeteriorado.getValue()));
			
		}
		return deteriorado;
	}
	
	public boolean tieneMonto()
	{
		String solicitado = (String)this.txtSolicitado.getValue();
		if(StringUtils.isNotEmpty(solicitado) && NumberUtils.isNumber(solicitado))
		{
			BigDecimal bdSolicitado = new BigDecimal(solicitado);
			return bdSolicitado.floatValue() > 0;
			
		}
		return false;
	}

	public void setTxtSolicitado(TextField txtSolicitado) {
		this.txtSolicitado = txtSolicitado;
	}

	public void setTxtCantidad(TextField txtCantidad) {
		this.txtCantidad = txtCantidad;
		this.txtCantidad.addListener(this);
	}

	public void setTxtImporte(TextField txtImporte) {
		this.txtImporte = txtImporte;
		this.txtImporte.addListener(this);
	}

	public void setTxtDeteriorado(TextField txtDeteriorado) {
		this.txtDeteriorado = txtDeteriorado;
	}

	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}

	public void setTxtTotalPorDivisa(TextField txtTotalPorDivisa) {
		this.txtTotalPorDivisa = txtTotalPorDivisa;
	}

	public void setTxtDiferencial(TextField txtDiferencial) {
		this.txtDiferencial = txtDiferencial;
	}

	public void setManejadorDivisa(ManejadorDivisa manejadorDivisa) {
		this.manejadorDivisa = manejadorDivisa;
	}
	
}
